package pe.com.bbva.pct.dao.impl;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.Query;

import org.springframework.stereotype.Repository;

import pe.com.bbva.pct.dao.ReglaDAO;
import pe.com.bbva.pct.domain.Regla;
import pe.com.bbva.pct.util.ConstantesGenerales;
import pe.com.bbva.pct.vo.ReglaVO;

@Repository("reglaDao")
public class ReglaDAOImpl extends GeneralDAOImpl<Regla> implements ReglaDAO{

	@SuppressWarnings("unchecked")
	@Override
	public int cantidadTotalValores(ReglaVO reglaVO)throws Exception{
		int cantidad=0;
		List<Regla> listaReglas =new ArrayList<Regla>(); 
		try {

				StringBuilder queryString = new StringBuilder();
				queryString.append("SELECT p FROM Regla p WHERE 1 = 1 AND p.idEstado.idValor <> " + ConstantesGenerales.VALOR_ELIMINADO );
				
				if (reglaVO.getNombre()!=null && !reglaVO.getNombre().trim().toUpperCase().equals("")) {
					queryString.append(" AND UPPER(p.nombre) like :pNombre ");
				}
				if (reglaVO.getNombreGuvnor()!=null && !reglaVO.getNombreGuvnor().trim().toUpperCase().equals("")) {
					queryString.append(" AND UPPER(p.nombreGuvnor) like :pNombreGuvnor ");
				}	
				if (reglaVO.getIdAplicacion()!=null && !reglaVO.getIdAplicacion().equals("")) {
					queryString.append(" AND p.idAplicacion.idAplicacion = :pIdAplicacion ");
				}
				
				queryString.append(" ORDER BY p.idRegla ASC ");
				
				Query query = em.createQuery(queryString.toString());
				
				if (reglaVO.getNombre()!=null && !reglaVO.getNombre().trim().toUpperCase().equals("")) {
					query.setParameter("pNombre", "%"+reglaVO.getNombre().toUpperCase().trim()+"%");
				}
				if (reglaVO.getNombreGuvnor()!=null && !reglaVO.getNombreGuvnor().trim().toUpperCase().equals("")) {
					query.setParameter("pNombreGuvnor", "%"+reglaVO.getNombreGuvnor().toUpperCase().trim()+"%");
				}
				if (reglaVO.getIdAplicacion()!=null && !reglaVO.getIdAplicacion().equals("")) {
					query.setParameter("pIdAplicacion", reglaVO.getIdAplicacion());
				}
				
				
				listaReglas= query.getResultList();	
				cantidad=listaReglas.size();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return cantidad;
	}
	
	
	@SuppressWarnings("unchecked")
	@Override
	public List<Regla> obtenerValoresPaginado(int first, int pageSize,ReglaVO reglaVO) throws Exception{
		List<Regla> listaReglas =new ArrayList<Regla>(); 
		try {


			StringBuilder queryString = new StringBuilder();
			queryString.append("SELECT p FROM Regla p WHERE 1 = 1 AND p.idEstado.idValor <> " + ConstantesGenerales.VALOR_ELIMINADO );
			
			if (reglaVO.getNombre()!=null && !reglaVO.getNombre().trim().toUpperCase().equals("")) {
				queryString.append(" AND UPPER(p.nombre) like :pNombre ");
			}
			if (reglaVO.getNombreGuvnor()!=null && !reglaVO.getNombreGuvnor().trim().toUpperCase().equals("")) {
				queryString.append(" AND UPPER(p.nombreGuvnor) like :pNombreGuvnor ");
			}	
			
			if (reglaVO.getIdAplicacion()!=null && !reglaVO.getIdAplicacion().equals("")) {
				queryString.append(" AND p.idAplicacion.idAplicacion = :pIdAplicacion ");
			}
			
			queryString.append(" ORDER BY p.idRegla ASC ");
			
			Query query = em.createQuery(queryString.toString());
			
			if (reglaVO.getNombre()!=null && !reglaVO.getNombre().trim().toUpperCase().equals("")) {
				query.setParameter("pNombre", "%"+reglaVO.getNombre().toUpperCase().trim()+"%");
			}
			if (reglaVO.getNombreGuvnor()!=null && !reglaVO.getNombreGuvnor().trim().toUpperCase().equals("")) {
				query.setParameter("pNombreGuvnor", "%"+reglaVO.getNombreGuvnor().toUpperCase().trim()+"%");
			}	
			
			if (reglaVO.getIdAplicacion()!=null && !reglaVO.getIdAplicacion().equals("")) {
				query.setParameter("pIdAplicacion", reglaVO.getIdAplicacion());
			}
			

		query.setFirstResult(first);
		query.setMaxResults(pageSize);
		listaReglas = query.getResultList();
		
		} catch (Exception e) {
			e.printStackTrace();
		}
		return listaReglas;
			
	}
	
	
	@SuppressWarnings("unchecked")
	@Override
	public List<Regla> listarReglasPorAplicacion(Long idAplicacion) throws Exception{
		List<Regla> listaReglas =new ArrayList<Regla>(); 
		try {
			StringBuilder queryString = new StringBuilder();
			queryString.append("SELECT p FROM Regla p WHERE 1 = 1 AND p.idEstado.idValor = " + ConstantesGenerales.EST_ACTIVO_VALOR_LISTADO +"  AND p.idAplicacion.idAplicacion = :pIdAplicacion " );
			Query query = em.createQuery(queryString.toString());
			query.setParameter("pIdAplicacion", idAplicacion);
			listaReglas = query.getResultList();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return listaReglas;
	}
	
}
